home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / number.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  5KB  |  272 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 15 "number.d"
  17. #include <math.h> 
  18.  
  19. #define    CLASS    Number_c
  20. #define    ivType    Number_iv_t
  21.  
  22. #include "generics.h"
  23.  
  24. object    Number_c;
  25.  
  26.  
  27. #line 22 "number.d"
  28. static double Round(double n, int p) 
  29.     double r; 
  30.  
  31.     r = pow(10.0, (double) p); 
  32.     r = floor(.5 + fabs(n * r)) / r; 
  33.     if (n < 0.0) return(-r); 
  34.     return(r); 
  35.  
  36. static int Ndrgtb(double n, int b) 
  37.     double base = b; 
  38.     int i; 
  39.  
  40.     n = n < 0.0 ? -n : n; 
  41.     i = 0; 
  42.     while (i < 20) { 
  43.         n -= floor(n); 
  44.         if (1E-12 >= n) break; 
  45.         i++; 
  46.         n = Round(n*base, 13); 
  47.     } 
  48.     return(i); 
  49.  
  50. #line 75 "number.d"
  51. static char *Nfmtb(double n, int b, char *t, int wth, int d, char *s) 
  52.     register int si, i; 
  53.     int sign, blnk, comma, left, paren, zfill, nd, dol, tw, dl, ez, ucase, cf=3, w=wth; 
  54.     double base; 
  55.     static char alpha[] = "0123456789abcdefghijklmnopqrstuvwxyz"; 
  56.  
  57.     if (b < 2 || b > (int)(sizeof(alpha)-1)) 
  58.         b = 10; 
  59.     base = b; 
  60.     if (sign = n < 0.0) 
  61.         n = -n; 
  62.  
  63.  
  64.     if (d >= 0) { 
  65.         double r = pow(base, (double) d); 
  66.         n = floor(base/20.0 + n * r) / r; 
  67.     } 
  68.  
  69.     switch (b) { 
  70.         case 10: 
  71.         cf = 3; 
  72.         dl = n < 1.0 ? 0 : 1 + (int) log10(n); 
  73.         break; 
  74.         case 2: 
  75.         cf = 4; 
  76.         dl = n < 1.0 ? 0 : 1 + (int) (log(n)/.6931471806); 
  77.         break; 
  78.         case 8: 
  79.         cf = 3; 
  80.         dl = n < 1.0 ? 0 : 1 + (int) (log(n)/2.079441542); 
  81.         break; 
  82.         case 16: 
  83.         cf = 4; 
  84.         dl = n < 1.0 ? 0 : 1 + (int) (log(n)/2.772588722); 
  85.         break; 
  86.         default: 
  87.         cf = 3; 
  88.         dl = n < 1.0 ? 0 : 1 + (int) (log(n)/log(base)); 
  89.         break; 
  90.     } 
  91.     if (d < 0) 
  92.         d = Ndrgtb(n, b); 
  93.     blnk = comma = left = paren = zfill = dol = ucase = 0; 
  94.     if (t) 
  95.         while (*t) 
  96.         switch (*t++) { 
  97.         case 'B': blnk = 1; break; 
  98.         case 'C': comma = (dl - 1) / cf; break; 
  99.         case 'L': left = 1; break; 
  100.         case 'P': paren = 1; break; 
  101.         case 'Z': zfill = 1; break; 
  102.         case 'D': dol = 1; break; 
  103.         case 'U': ucase = 1; break; 
  104.     } 
  105.  
  106.  
  107.  
  108.     ez = n < 1.0; 
  109.     tw = dol + paren + comma + sign + dl + d + !!d + ez; 
  110.  
  111.     if (w < 1) 
  112.         w = tw; 
  113.     else if (tw > w) { 
  114.         if (ez) 
  115.             tw -= ez--; 
  116.         if ((i=dol) && tw > w) 
  117.             tw -= dol--; 
  118.         if (tw > w && comma) { 
  119.             tw -= comma; 
  120.             comma = 0; 
  121.         } 
  122.         if (tw < w && i) { 
  123.             tw++; 
  124.             dol = 1; 
  125.         } 
  126.         if (tw > w && paren) 
  127.             tw -= paren--; 
  128.         if (tw > w) { 
  129.             nofit: 
  130.             for (i=0 ; i < w ; ) 
  131.                 s[i++] = '*'; 
  132.             s[i] = '\0'; 
  133.             return(s); 
  134.         } 
  135.     } 
  136.  
  137.     n = floor(.5 + n * floor(.5 + pow(base, (double) d))); 
  138.     if (blnk && n == 0.0) { 
  139.         for (i=0 ; i < wth ; ) 
  140.             s[i++] = ' '; 
  141.         s[wth] = '\0'; 
  142.         return(s); 
  143.     } 
  144.     s[si = w] = '\0'; 
  145.     if (left && w > tw) { 
  146.         i = w - tw; 
  147.         while (i--) 
  148.             s[--si] = ' '; 
  149.     } 
  150.     if (paren) 
  151.         s[--si] = sign ? ')' : ' '; 
  152.     for (nd=0 ; nd < d && si ; nd++) { 
  153.         n /= base; 
  154.         i = (int) floor(base * (n - floor(n)) + .5); 
  155.         n = floor(n); 
  156.         s[--si] = ucase && i > 9 ? alpha[i]+('A'-'a') : alpha[i]; 
  157.     } 
  158.     if (d) 
  159.         if (si) 
  160.         s[--si] = '.'; 
  161.     else 
  162.         n = 1.0; 
  163.     if (ez && si > sign + dol) 
  164.         s[--si] = '0'; 
  165.     nd = 0; 
  166.     while (n > 0.0 && si) 
  167.         if (comma && nd == cf) { 
  168.         s[--si] = ','; 
  169.         nd = 0; 
  170.     } else { 
  171.         n /= base; 
  172.         i = (int) floor(base * (n - floor(n)) + .5); 
  173.         n = floor(n); 
  174.         s[--si] = ucase && i > 9 ? alpha[i]+('A'-'a') : alpha[i]; 
  175.         nd++; 
  176.     } 
  177.     if (zfill) { 
  178.         i = sign + dol; 
  179.         while (si > i) 
  180.             s[--si] = '0'; 
  181.     } 
  182.     if (sign) 
  183.         if (si) 
  184.         s[--si] = paren ? '(' : '-'; 
  185.     else 
  186.         n = 1.0; 
  187.     if (dol && si) 
  188.         s[--si] = '$'; 
  189.     while (si) 
  190.         s[--si] = ' '; 
  191.     if (n != 0.0) 
  192.         goto nofit; 
  193.     return(s); 
  194.  
  195. imeth objrtn Number_im_gFormatNumber(object self, char *msk, int wth, int dp)
  196.     char buf[80]; 
  197.  
  198.     Nfmtb(gDoubleValue(self), 10, msk, wth, dp, buf); 
  199.     return gNewWithStr(String, buf); 
  200.  
  201. #if 0 
  202.  
  203.  
  204.     double t; 
  205.  
  206.     t = .6125423371 * gDoubleValue(self); 
  207.     t = t < 0.0 ? -t : t; 
  208.     return (int) (BIG_INT * (t - floor(t))); 
  209.  
  210. #endif 
  211.  
  212. imeth int Number_im_gCompare(object self, object obj)
  213.     double sv, ov; 
  214.  
  215.     ChkArg(obj, 2); 
  216.     if (!gIsKindOf(obj, Number)) 
  217.         return oSuper(Number_c, gCompare, self)(self, obj); 
  218.     if ((sv=gDoubleValue(self)) < (ov=gDoubleValue(obj))) 
  219.         return -1; 
  220.     else if (sv == ov) 
  221.         return 0; 
  222.     else 
  223.         return 1; 
  224.  
  225.  
  226. #line 239 "number.c"
  227.  
  228. objrtn    Number_initialize(void)
  229. {
  230.     static  CRITICALSECTION  cs;
  231.     static  int volatile once = 0;
  232.  
  233.     ENTERCRITICALSECTION(_CI_CS_);
  234.     if (!once) {
  235.         INITIALIZECRITICALSECTION(cs);
  236.         once = 1;
  237.     }
  238.     LEAVECRITICALSECTION(_CI_CS_);
  239.  
  240.     ENTERCRITICALSECTION(cs);
  241.  
  242.     if (Number_c) {
  243.         LEAVECRITICALSECTION(cs);
  244.         return Number_c;
  245.     }
  246.     INHIBIT_THREADER;
  247.     Number_c = gNewClass(Class, "Number", 0, 0, END);
  248.     iMethodFor(Number, gCompare, Number_im_gCompare);
  249.     iMethodFor(Number, gFormatNumber, Number_im_gFormatNumber);
  250.  
  251.     ENABLE_THREADER;
  252.  
  253.     LEAVECRITICALSECTION(cs);
  254.  
  255.     return Number_c;
  256. }
  257.  
  258.  
  259.  
  260.